函式、裝飾器
基本語法
def 函式名稱(參數名稱):
函式內部的程式碼
def 函式名稱(參數名稱1, 參數名稱2):
函式內部的程式碼
範例:
#定義可以顯示Hello的函式
def sayHello():
print("Hello")
#定義可以印出任何訊息的函式
def say(msg):
print(msg)
#定義一個可以做加法的函式, 可以一次使用多個變數
def add(n1, n2):
result=n1+n2
print(result)
語法
函式名稱(參數資料)
範例
#定義一個印出 Hello 的函式
def sayHello():
print("Hello")
#定義一個可以顯示任何訊息的函式
def say(msg):
print(msg)
#呼叫上方定義的函式
sayHello()
#讓say函式的msg變數成為 Hello 字串或 123 變數
say("Hello")
say(123)
語法
def 函式名稱(參數名稱):
函式內部程式碼
return #強制結束函式,回傳 None
def 函式名稱(參數名稱):
函式內部程式碼
return 資料#強制結束函式,回傳[資料(數字、字串、浮點數、字典、...)]
範例
#函式定義
def say(msg):
print(msg)
# return msg #這就可以回傳 msg 的值
return
value=say("Hello Function")
print(value) #因為沒有回傳值,所以會回傳 None
裝飾器本身是一個經過特殊設計的「函式」,用來「輔助」其他的函示
def 裝飾器名稱(回呼函示名稱):
def 內部函式名稱():
#裝飾器內部的程式碼
回呼函式名稱()
return 內部函式名稱
#--以上為裝飾器的宣告方式
#下面為裝飾器的使用方式
#---------------------------
@裝飾器名稱
def 函式名稱():
#函式內部的程式碼
#-----如此一來這函式就「帶有」裝飾器
函式名稱()#呼叫帶有裝飾器的函示
#如此一來此函式與普通還是的功能就稍有不同
#定義
def testDecorator(callback):
def innerFunc():
print("這是裝飾器")
callback()
return innerFunc
#賦予普通函式(名:decoratedFunc)擁有裝飾器(名:testDecorator)函式的功能
#簡單來說是「使用」裝飾器
@testDecorator #不用空格
def decoratedFunc():
print("普通函式")
#我們看看最後的結果
#我們呼叫此函數時,會先去執行裝飾器的內容,再執行普通函式的內容
decoratedFunc()
大致講解:
呼叫有裝飾器函式後,會先執行裝飾器內部的程式,再執行函式本身
那我們如何例用函式的參數來工作呢?
我們先看範例:
#定義
def testDecorator(callback):
def innerFunc():
print("這是裝飾器")
callback(3)
return innerFunc
#簡單來說是「使用」裝飾器
@testDecorator #不用空格
def decoratedFunc(data):
print("普通函式",data)
decoratedFunc()
#如此一來我們更能確定,裝飾器的執行步驟
'''
1.呼叫 decoratedFunc (15行)
2.執行 testDecorator 且將 decoratedFunc 設為 callback
3.執行print("這是裝飾器")
4.執行callback(3)
5.呼叫到 decoratedFunc 並把data設為 3 (12行)
6.執行print("普通函式",data)
'''
範例程式:
#定義裝飾器
def myDec(callback):
def code():
print("裝飾器")
callback()
return code
#使用裝飾器
#@myDec
def test():
print("普通函式")
test()
若使用沒有裝飾器的情況下,我們呼叫 test() 就真的只會執行
test函數
那麼我們如果增加@myDec
結果會為如何呢?
真的是先跑裝飾器ㄟ~~~ !!
範例程式 :
#定義裝飾器
def myDec(callback):
def code():
print("裝飾器")
callback(3)
return code
#使用裝飾器
@myDec
def test(data):
print("普通函式數值 : ",data)
test()
我們看看結果:
跟你想的有沒有一樣阿?有的話就接著繼續喔~~
定義一個裝飾器,可以從 1 加到 100(先自己練習一下,不行才能看code喔)
#定義裝飾器
from re import I
def Dec(callback):
def code():
num = 0
for i in range(1,101,1): #為什麼是101?因為for是1算到(n-1)
num+=i
callback(num)
return code
#使用裝飾器
@Dec
def count(data):
print("1加到100的值為 : ",data)
def count2(data):
print("1加到100的值為 : ",data)
count()
Dec(counter)()
正確無誤!
Decorator Factory 用來「生產」裝飾器的「函式」
#定義裝飾器工廠
def 裝飾器工廠名稱(參數名稱, ...):
def 裝飾器名稱(回呼函式名稱):
def 內部函式名稱():
#裝飾器內部程式碼
回呼函式名稱()
return 內部函式名稱
return 裝飾器名稱
#使用裝飾器工廠
@裝飾器工廠名稱(參數資料, ...)
def 函式名稱():
#函式內部的程式碼
#呼叫帶有裝飾器的函式
函式名稱()
'''
1. 運行函式
2. 執行裝飾器工廠
3. 再執行回呼函式的內容
'''
ㄟㄟㄟ,你有沒有感覺像把之前說的裝飾器再加上一層函式而已
#定義
def testFactory(base):
def testDecorator(callback):
def innerFunc():
print("裝飾器",base)
callback()
return innerFunc
return testDecorate
#--------------------------------------------
#使用
@teatFactory(3)
def decoratedFunc():
print("普通函式")
#--------------------------------------------
#呼叫
decoratedFunc()
裝飾器工廠讓裝飾器變得更有彈性
#定義
def testFactory(base):
def testDecorator(callback):
def innerFunc():
result=base*3
callback(result)
return innerFunc
return testDecorator
#使用
@testFactory(3)
def decoratedFunc(result):
print("普通函式",result)
#呼叫
decoratedFunc()
#定義
def DecFactory(DecBase):
def myDecorator(callback):
def func():
result = DecBase
print("Hello i am Dec")
print("My DecBase is ",DecBase)
callback(DecBase)
return func
return myDecorator
#使用
@DecFactory(3)
def mydecoratedfunc(result):
print("I am normal func")
print("my DecBase :",result)
#呼叫
mydecoratedfunc()
先推推看DecBase = ? , result = ?
DecBase = 3 , result = 3
利用Decorator Factory 寫一個 1+...+100 的Code
(可以先自己練習看看喔) ~答案再下面的詳細資料喔~
#定義
def DecFectory(base):
def myDec(callback):
def myDecFuc():
result=0
for i in range (base):
result+=i
callback(result)
return myDecFuc
return myDec
#使用
@DecFectory(101)
def myfunc(result):
print("my Dec count's ans: ",result)
#呼叫
myfunc()
Python 裝飾器 Decorator - 基本篇 By 彭彭
Python 裝飾器工廠 Decorator Factory By 彭彭